home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / TARFILE.GZ / tarfile / ch_3.5 / bcd / edge / thin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-09-11  |  1.5 KB  |  73 lines

  1. /*
  2.  * (c) Copyright 1988 by
  3.  * Robotics Principles Research Department, ATT Bell Laboratories.
  4.  * All rights reserved.
  5.  * Last modified 2/8/88 Ingemar J. Cox
  6.  *
  7.  *    Original thinning code (in LISP) courtesy of J. F. Canny
  8.  *    Converted to C++ 1/15/88, Ingemar J. Cox
  9.  *    C version 8/2/88 Deborah A. Wallach
  10.  *    C version 11/4/88 W. J. Kropfl 
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <math.h>
  15. #include "edge_finder.h"
  16.  
  17. extern struct image *my_image;
  18.  
  19. unsigned char* image_thin()
  20. {
  21.     register unsigned char *emP, *emPiy;
  22.     register int ix, nx, nxM1, nxP1;
  23.     register int iy, nlinks, npieces;
  24.     register int ny, nyM1;
  25.  
  26.     register int b01, b12, b21, b10;
  27.     register int p1, p2, p3, p4;
  28.     register int b00, b02, b20, b22;
  29.     
  30.     nx   = my_image->nx;
  31.     nxM1 = nx - 1;
  32.     nxP1 = nx + 1;
  33.     nyM1 = my_image->ny - 1;
  34.  
  35.     emPiy = &my_image->edge_map[0];
  36.     for(iy=1; iy<nyM1; iy++)
  37.     {
  38.         emPiy += nx;
  39.         for(ix=1; ix<nxM1; ix++)
  40.         {
  41.             emP = emPiy + ix;
  42.             b01 = *(emP-nx)>0;
  43.             b12 = *(emP+1)>0;
  44.             b21 = *(emP+nx)>0;
  45.             b10 = *(emP-1)>0;
  46.             if((b01+b12+b21+b10)>1)
  47.             {
  48.                 b00 = *(emP-nxP1)>0;
  49.                 b02 = *(emP-nxM1)>0;
  50.                 b20 = *(emP+nxM1)>0;
  51.                 b22 = *(emP+nxP1)>0;
  52.                 
  53.                 p1 = b00 | b01;
  54.                 p2 = b02 | b12;
  55.                 p3 = b22 | b21;
  56.                 p4 = b20 | b10;
  57.                 
  58.                 nlinks  = b01 & p2;
  59.                 nlinks += b12 & p3;
  60.                 nlinks += b21 & p4;
  61.                 nlinks += b10 & p1;
  62.                 
  63.                 npieces = p1 + p2 + p3 + p4;
  64.                 
  65.                 if((npieces-nlinks)<2)
  66.                     *emP = 0;   /*edge_map[iy*nx+ix]=0; */
  67.             }
  68.         }
  69.     }
  70.     return(my_image->edge_map);
  71. }
  72.  
  73.